/**************************************************************************************************
	Fichier: Formes.c
	Ensemble des fonctions d'initialisation, d'affichage, de destruction et de rotation d'une pièce.
***************************************************************************************************/
#include "Formes.h"

Piece* FormeCreerPiece(void)
{
	Piece* sortie = (Piece*)malloc(sizeof(Piece)); /* on alloue de la place en mémoire pour créer une pièce */
	return sortie;
}

void FormeDetruirePiece(Piece* p)
{
	free(p); /* on libère la place mémoire qu'on avait demandé lors de la création de la Pièce */
}

void FormeInitialiserPiece(Piece* p, Couleur c, int f[MAX_TAILLE_PIECE_X][MAX_TAILLE_PIECE_Y])
{
	int i;
	int j;
	p->couleur = c;/* on initialise la couleur avec celle donnée en paramètre */
	for ( i = 0 ; i < MAX_TAILLE_PIECE_X ; i++ )/* on parcours le tableau forme dans pièce */
	{
		for ( j = 0 ; j < MAX_TAILLE_PIECE_Y; j++)
		{
			p->forme[j][i] = f[i][j];         /* on initialise le tableau forme avec celui donné en paramètre */
			
		}
	}
	p->posXpiece = 0; /* indique une piece hors du terrain */
	p->posYpiece = -MAX_TAILLE_PIECE_Y; /* indique une piece hors du terrain */
}

void FormeRotationPiece(Piece* p)
{

	int tmp[MAX_TAILLE_PIECE_X][MAX_TAILLE_PIECE_Y] = {{0}}; /* tmp est une pièce vide */
	int i;
	int j;
	int k;
	int l;

	for ( i = 0 ; i < MAX_TAILLE_PIECE_X ; i++ )/* on tourne la pièce de 90° vers la droite */
	{
		for ( j = 0 ; j < MAX_TAILLE_PIECE_Y; j++)
		{
			tmp[MAX_TAILLE_PIECE_X-j-1][i] = p->forme[i][j]; /* on stocke dans le tableau tmp la pièce avec la rotation */
        }
	}
	for ( k = 0 ; k < MAX_TAILLE_PIECE_X ; k++ )
	{
		for ( l = 0 ; l < MAX_TAILLE_PIECE_Y; l++)
		{
			p->forme[k][l] = tmp[k][l];/* et on met dans forme tmp */
		}
	}
}

int FormeEstVide(Piece* p)
{
	int i;
	int j;
	for ( i = 0 ; i < MAX_TAILLE_PIECE_X ; i++)/* on parcours le tableau forme dans pièce */
	{
		for ( j = 0 ; j < MAX_TAILLE_PIECE_Y ; j++)
		{
			if ( p->forme[i][j] == 1 )
			{
				return 0; /* si on rencontre au moins un 1 dans le tableau forme, pièce p n'est pas vide, donc on retourne 0 */
			}
		}
	}
	return 1; /* si on ne rencontre aucun 1 dans le tableau forme, la pièce p est bien vide, on retourne 1.*/
}

void FormeAfficherPiece(Piece* p)
{
	int i;
	int j;
	if(p!=NULL)/* si p est initialisé */
	{
        for ( j = 0 ; j < MAX_TAILLE_PIECE_Y ; j++)/* on parcours le tableau forme dans pièce */
        {
            for ( i = 0 ; i < MAX_TAILLE_PIECE_X ; i++)
            {
                printf("%d",p->forme[i][j]); /* on affiche la tableau forme */
            }
            printf("\n");
        }
	}
	else
	{
	    printf("Il n'y pas de forme pour l'instant\n");
	}
}


/**
	Définition des pièces

**/

int Formes[COULEUR_MAX][MAX_TAILLE_PIECE_X][MAX_TAILLE_PIECE_Y] ={

/*BARRE*/
{{0,1,0,0},
{0,1,0,0},
{0,1,0,0},
{0,1,0,0}},

/*L_NORMAL*/
{{0,0,0,0},
{0,1,0,0},
{0,1,0,0},
{0,1,1,0}},

/*L_INVERSE*/
{{0,0,0,0},
{0,0,1,0},
{0,0,1,0},
{0,1,1,0}},

/*LE_T*/
{{0,0,0,0},
{0,0,0,0},
{0,1,0,0},
{1,1,1,0}},

/*CARRE*/
{{0,0,0,0},
{0,0,0,0},
{0,1,1,0},
{0,1,1,0}},

/*ESCALIER*/
{{0,0,0,0},
{0,1,0,0},
{0,1,1,0},
{0,0,1,0}},

/*ESCALIER_INVERSE*/
{{0,0,0,0},
{0,0,1,0},
{0,1,1,0},
{0,1,0,0}},

/*miniBarre*/ /* pour avoir des pieces différentes du vraie jeu */
{{0,0,0,0},
{0,0,1,0},
{0,0,1,0},
{0,0,1,0}},

/*Magique*/ /* pièce magique qui se mets partout, rend le jeu plus simple */
{{0,0,0,0},
{0,0,0,0},
{0,1,0,0},
{0,1,1,0}},

};/* on aurait pu inventer toutes pièces si on respecte la condition. */
